package com.example.redis.Controller;

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.example.redis.common.enums.RedisDelayQueueEnum;
import com.example.redis.domain.UserDTO;
import com.example.redis.service.UserService;
import com.example.redis.util.RedisDelayQueueUtil;
import com.example.redis.util.RedisUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;


/**
 *  延迟队列
 * @Description  DelayQueueController
 * @Author guoyb
 * @Date   2022/6/28 11:27
 */
@RestController
@RequestMapping("/queue")
@Slf4j
@Api("延迟队列")
public class DelayQueueController {

//    1、下单成功，30分钟未支付。支付超时，自动取消订单
//
// 2、订单签收，签收后7天未进行评价。订单超时未评价，系统默认好评
//
// 3、下单成功，商家5分钟未接单，订单取消
//
// 4、配送超时，推送短信提醒
//
// 5、三天会员试用期，三天到期后准时准点通知用户，试用产品到期了


    @Resource
    private RedisDelayQueueUtil redisDelayQueueUtil;

    @PostMapping("/addQueue")
    @ApiOperation("添加延迟任务-订单支付超时")
    public String addQueue() {
        Map<String, String> map1 = new HashMap<>();
        map1.put("orderId", "100");
        map1.put("remark", "订单支付超时，自动取消订单");

        // 添加订单支付超时，自动取消订单延迟队列。为了测试效果，延迟60秒钟
        redisDelayQueueUtil.addDelayQueue(map1, 60, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_PAYMENT_TIMEOUT.getCode());

        log.info("添加订单支付超时addQueue-----打印日志------{}", DateUtil.now());
        return "success";
    }

    @PostMapping("/addQueue2")
    @ApiOperation("添加延迟任务-订单超时未评价")
    public String addQueue2() {

        Map<String, String> map2 = new HashMap<>();
        map2.put("orderId", "200");
        map2.put("remark", "订单超时未评价，系统默认好评");

        // 订单超时未评价，系统默认好评。为了测试效果，延迟10秒钟
        redisDelayQueueUtil.addDelayQueue(map2, 10, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_TIMEOUT_NOT_EVALUATED.getCode());
        log.info("订单超时未评价-----打印日志------{}", DateUtil.now());
        return "success";
    }


    @PostMapping("/editQueue")
    @ApiOperation("修改订单支付超时")
    public String editQueue() {
        Map<String, String> map1 = new HashMap<>();
        map1.put("orderId", "100");
        map1.put("remark", "订单支付超时，自动取消订单");

        String queueCode = RedisDelayQueueEnum.ORDER_PAYMENT_TIMEOUT.getCode();
        boolean b = redisDelayQueueUtil.removeDelayedQueue(map1, queueCode);
        if (!b) {
            log.warn("删除指定队列中的消息~~~未找到:{}",queueCode);
        }else{
            // 添加订单支付超时，自动取消订单延迟队列。为了测试效果，延迟10秒钟
            redisDelayQueueUtil.addDelayQueue(map1, 10, TimeUnit.SECONDS, queueCode);

            log.info("editQueue-----打印日志------{}", DateUtil.now());
        }


        return "success";
    }



    //移除延迟队列
    @PostMapping("/removeQueue")
    @ApiOperation("移除延迟队列-订单支付超时")
    public String removeQueue() {
        Map<String, String> map1 = new HashMap<>();
        map1.put("orderId", "100");
        map1.put("remark", "订单支付超时，自动取消订单");


        String queueCode = RedisDelayQueueEnum.ORDER_PAYMENT_TIMEOUT.getCode();
        boolean b = redisDelayQueueUtil.removeDelayedQueue(map1, queueCode);
        if (!b) {
            log.warn("删除指定队列中的消息~~~未找到:{}",queueCode);
        }else{
            log.info("删除指定队列中的消息~~:{}",map1);
        }

        return "success";
    }

}
